

/*
消息中心
处理消息收发

*/


function MsgCenter()
{
	var usr_chunk=null;
	function _add(uid)
	{
		var uid=parseInt(uid);
		if(usr_chunk==null)
		{
			usr_chunk=[];
		}
		
		for(var i=0;i<usr_chunk.length;i++)
		{
			if(usr_chunk[i].uid==uid)
			{
				usr_chunk[i].get=true;
				return true;
			}
		}
		usr_chunk.push({uid:uid,get:true});
		return true;
	}
	function _get(uid)
	{
		var uid=parseInt(uid);
		for(var i=0;i<usr_chunk.length;i++)
		{
			if(usr_chunk[i].uid==uid)
			{
				return usr_chunk[i].get;
			}
		}
		return false;
	}
	this.stop=function(uid)
	{
		var uid=parseInt(uid);
		for(var i=0;i<usr_chunk.length;i++)
		{
			if(usr_chunk[i].uid==uid)
			{
				usr_chunk[i].get=false;
			}
		}
	}
	//未刷新后stop了轮询后如果要重启轮询，必须要使用此方法
	this.restart=function(uid)
	{
		_add(uid);
	}
	
	
	/*
	轮询函数
	*/
	
	this.openchunk=function(uid/*,callback*/)
	{
		/*var chunk_arr=null;
		if(add!=undefined||add!=null)
		{
			if(chunk_arr==null||chunk_arr==undefined)
			{
				chunk_arr=new Array();
			}
			for (var i=0;i<chunk_arr.length ;i++ )
			{
				if(chunk_arr[i]==add)
				{
					return false;
				}
			}
			chunk_arr.push(add);

			chunk(chunk_arr[chunk_arr.length-1]);

		}
		*/
		_add(uid);
		chunk(uid);
		//getstatus(uid/*,callback*/);
		//console.log(usr.getfrdsid(uid));
		
		getstatus(uid,usr.getpro(uid,'status'),(usr.getfrdsid(uid)==false?'':usr.getfrdsid(uid).join(",")),(usr.getpro(uid,'lastcnt')==undefined||usr.getpro(uid,'lastcnt')==false?'':usr.getpro(uid,'lastcnt')));
	}

	/*
	设置自己的在线状态，获取好友的在线状态，顺便将最近联系人条目更新
	*/
	var getstatus=function(uid,us,fs,last)
	{
		var uid=uid;

		var getallstatus={
			type:'POST',
			/*
			2015/10/24之前使用data:'u='+uid+'&&us='+usr.getpro(uid,'status')+'&&fs='+usr.getfrdsid(uid).join(",")
			由于getallstatus此对象在创建时已经固定好变量值，因此使用usr.getpro(uid,'status')动态获取根本只是首次调用时的值，点击改变状态和全局状态码后
			此对象还是使用首次调用的值，每次改变状态后，此对象又重新发送首次设置的状态，使状态无法改变，
			改变方法：使用每隔20秒调用本方法，而不再是隔20秒使用ajax发送本getallstatus对象，来获取好友状态和更新本人状态，14：50分实测成功
			*/
			data:'u='+uid+'&&us='+us+'&&fs='+fs+'&&last='+last,//获取所有在线用户的消息    
			dataType:'json',
			url:'action/getstatus.php',
			success:function(msg)
			{		
				/*
					msg格式
					msg[i].fid
					msg[i].status;
				*/
				//console.log('------------user:'+uid+' get a status--------');
				//console.log(msg);
				//console.log(usr.getmsg(uid));
				//console.log('--------------------end--------------------');
				_msg_allocation(uid,msg);
				if(msg&&msg!='false'&&msg.length>0)
				{
					if(_get(uid)&&usr.getuser(uid))
					{
						//callback(msg);
						//设置显示状态
						_setstatus(uid,msg);
						//---setTimeout(function(){$.ajax(getallstatus);},20000);//轮询后20秒重新发送
					}
					else
					{
						console.log(uid+'status找不到轮询id,停止分配状态');
						return;
					}
				}
				else
				{
					console.log(uid+'可能没有好友或获取好友状态出错，等待25秒后再次轮询');
				}
	
				if(_get(uid)&&usr.getuser(uid))
				{
						//callback(msg);
					//setTimeout(function(){$.ajax(getallstatus);},20000);//轮询后20秒重新发送 //2015/10/24优化改进，见上
					setTimeout(function(){getstatus(uid,usr.getpro(uid,'status'),(usr.getfrdsid(uid)==false?'':usr.getfrdsid(uid).join(",")),(usr.getpro(uid,'lastcnt')==undefined||usr.getpro(uid,'lastcnt')==false?'':usr.getpro(uid,'lastcnt')));},25000);
				}
				else
				{
					console.log(uid+'status找不到轮询id,停止下次轮询');
					return;
				}
				
			}
			,
			error:function()
			{
				console.log(uid+'status网络连接失败');
				if(_get(uid)&&usr.getuser(uid))
				{
					console.log(uid+'status网络重连');
						//callback(msg);
					//setTimeout(function(){$.ajax(getallstatus);},20000);//轮询后20秒重新发送 //2015/10/24优化改进，见上
					setTimeout(function(){getstatus(uid,usr.getpro(uid,'status'),(usr.getfrdsid(uid)==false?'':usr.getfrdsid(uid).join(",")),(usr.getpro(uid,'lastcnt')==undefined||usr.getpro(uid,'lastcnt')==false?'':usr.getpro(uid,'lastcnt')));},30000);
				}
				else
				{
					console.log(uid+'status网络连接停止');
					return;
				}
			}
		};
		$.ajax(getallstatus);
		return;
	}



	var chunk=function(uid)
	{
			var uid=uid;
			var sendchunk={
				type:'POST',
				data:'u='+uid,//获取所有在线用户的消息
				dataType:'json',
				url:'action/getComet.php',
				success:function(msg)
				{
					console.log('chunk success');
					//console.log(msg);
					//如果返回的不是false
					if(msg)
					{
						//clearTimeout(to);
						console.log('------------user:'+uid+' get a msg--------');
						//console.log(msg);
						//console.log(usr.getmsg(uid));//这个千万别打开，获取过信息就会删除，影响下面的信息获取
						//console.log('--------------------end--------------------');
						_msg_allocation(uid,msg);
						if(_get(uid)&&usr.getuser(uid))
						{
							//setTimeout(function(){$.ajax(sendchunk);},1000);//轮询后1秒重新发送
							setTimeout(function(){chunk(uid);},1000);
						}
						else
						{
							console.log(uid+'chunk找不到轮询id,停止下次轮询');
							return;
						}
						
					}
					else
					{
						console.log(uid+'chunk返回false,停止分配消息');
						return;
					}
					
					
				}
				,
				error:function(m)
				{
					console.log(uid+'chunk网络连接失败'+m);
					console.log(m);
					if(_get(uid)&&usr.getuser(uid))
					{
						console.log(uid+'chunk网络重连');
						//setTimeout(function(){$.ajax(sendchunk);},1000);
						setTimeout(function(){chunk(uid);},2000);
						//轮询后20秒重新发送
					}
					else
					{
						console.log(uid+'chunk网络连接停止');
						return;
					}
				}
			};
			$.ajax(sendchunk);
			return;
	}
	
	function _setstatus(uid,msg)
	{
		var uid=uid;
		if(usr.getuser(uid)==false)
		{
			return false;
		}

		if(msg&&msg!='false')
		{
			for (var i=0;i<msg.length;i++)
			{
				var st=parseInt(msg[i].status);
				var fid=msg[i].fid;
				//console.log("user="+uid+' userstatus='+usr.getpro(uid,'status')+" fid="+fid+" status="+st);
				//console.log(usr.getfrdsid(uid).join(","));

				var fd=$("#ico_contacts_"+uid+" div[name='frd_"+fid+"']");
				var lastfd=$("#ico_last_"+uid+" div[lastid='frd_"+fid+"']");

				if(fd[0]==undefined||fd[0]==''||fd[0]==null)
				{
					//console.log('fd是undefined');
					continue;
				}
				
				
				//设置离线状态
				if(st==0||st==6)
				{
					usr.set2pro(uid,'frd','id',fid,'status',0);

					//console.log('离线');
					if(fd.attr("class").indexOf("fds_offline")>=0)
					{
						//console.log('已经设置过离线，返回');
						//如果之前已经是离线，则直接返回
						continue;
					}
					//console.log('准备设置离线');
					var limg=usr.getaother(uid,fid).imggray;
					//console.log(fid+'离线图片='+limg);
	
					
					//去除状态图标
					fd.find(".frdolflag").attr("class","frdolflag");
					fd.find(".imagehead>img").attr("src",limg);
					fd.find(".frdnew").html("[离线请留言]");
					//更改离线线class
					var fdclass=fd.attr("class");
					fdclass=fdclass.replace("fds_online","fds_offline");
					fd.attr("class",fdclass);
					//console.log('离线class');
					//移动到最低处
					var gid=fd.parents(".groups").attr("id");
					fd.insertAfter("#ico_contacts_"+uid+" #"+gid+" .fds:last");
					//console.log("#ico_contacts_"+uid+" #"+gid+" .fds:last");
					$('.owner_'+uid+' .imghead_status').attr("src",limg);
					if($("#chatframe_frd"+fid+"_"+uid).length>0)
					{
						//console.log('离线设置对话框');
						//$("#chatframe_frd"+fid+"_"+uid).find(".imghead>img").attr("src",limg);
						bottombar.setimg("frd"+fid,uid,limg);
						//console.log('离线对话框设置完毕');
					}

					if(lastfd.length>0)
					{
						//去除状态图标
						lastfd.find(".frdolflag").attr("class","frdolflag");
						lastfd.find(".imagehead>img").attr("src",limg);
						lastfd.addClass('lastfds_offline').removeClass('lastfds_online');
					}
					
				}
				else 
				{
					usr.set2pro(uid,'frd','id',fid,'status',st);
					//console.log('在线');
					var imagehead=' frd';
					if(st==1)
					{
						imagehead='';
					}
					else if(st==2)
					{
						imagehead+='qme';
					}
					else if(st==3)
					{
						imagehead+='away';
					}
					else if(st==4)
					{
						imagehead+='busy';
					}
					else if(st==5)
					{
						imagehead+='mute';
					}
					fd.find(".frdolflag").attr("class","frdolflag"+imagehead);
					//console.log('准备设置在线');
					//如果该好友之前是离线，则设置各种在线参数
					if(fd.attr("class").indexOf("fds_offline")>=0)
					{
						//console.log('如果是离线，设置回在线状态');
						//console.log(usr.getaother(uid,fid).sign);
						fd.find(".imagehead>img").attr("src",usr.getaother(uid,fid).img);
						fd.find(".frdnew").html(usr.getaother(uid,fid).sign);
						var fdclass=fd.attr("class").replace("fds_offline","fds_online");
						fd.attr("class",fdclass);
						//移动到最高处
						var gid=fd.parents(".groups").attr("id");
						//lastfd.insertBefore("#ico_last_"+uid+" .lastfds:first");
						fd.insertAfter("#ico_contacts_"+uid+" #"+gid+" .fds:first");
						
						//设置上线提示音
						$('#gotaglobal')[0].play();
						//console.log('在线设置完毕');
					}

					$('.owner_'+uid+' .imghead_status').attr("src",usr.getaother(uid,fid).img);

					if($("#chatframe_frd"+fid+"_"+uid).length>0)
					{
						$("#chatframe_frd"+fid+"_"+uid+" .frdolflag").attr("class","frdolflag"+imagehead);
						//console.log('在线设置对话框');
					}
					if(lastfd.length>0)
					{
						lastfd.find(".frdolflag").attr("class","frdolflag"+imagehead);
						lastfd.find(".imagehead>img").attr("src",usr.getaother(uid,fid).img);
						//console.log('在线设置最近好友');
					}
				}

			}
			
		}
	}






	//消息分配处理
	var _msg_allocation=function(uid,msg)
	{
		
		if(msg)
		{
			if(msg.cm)
			{
				setone(uid,msg.cm,'frd');
			}
			if(msg.grp)
			{
				setone(uid,msg.grp,'grp');
			}
			if(msg.dis)
			{
				setone(uid,msg.dis,'dis');
			}
			if(msg.newsinfo)
			{
				setone(uid,msg.newsinfo,'newsinfo');
			}
			if(msg.sys)
			{
				setone(uid,msg.sys,'sys');
			}
			if(msg.verify)
			{
				setone(uid,msg.verify,'verify');
			}
			 //$('#didi')[0].controls.play();   
			//$('body').append(' <EMBED id="didi" name="mp3" src="Classic/msg.wav" hidden="true" type="audio/mpeg" loop="0" autostart="false">');
			 //$('body').append('<embed id="didi"  loop=true  volume="60" autostart=true hidden=true src="Classic/msg.wav" />');
		}
		else
		{
			//console.log('-----case else-----');
			//console.log(msg);
			//console.log('-----case else-----');
		}
	}

	var setone=function(uid,msgobj,ty)
	{	
		//1 相互好友(直接打开会话)，2 我与他单向好友(直接打开会话)，3 他与我单向好友(创建临时会话)
		var isfrd=msgobj.isfrd==undefined?1:parseInt(msgobj.isfrd);//2015/11/20等待扩展
		console.log('isfrd='+isfrd);
		if(isfrd!=1)
		{
			return false;
		}

		if(ty=="frd"||ty=="grp"||ty=="dis")
		{
			var fromid=msgobj.fromid||msgobj.gid||msgobj.did;
			
			//如果已经有聊天框 
			if($("#chatframe_"+ty+fromid+"_"+uid).length>0)
			{
				//console.log('add to chatframe');
				//add2box('frd',msg[i].time,msg[i].content,msg[i].fromid,msg[i].toid);
				add2box(msgobj.id,'frd',ty+fromid,uid,msgobj.mode,msgobj.content,msgobj.time);

				if($("#chatframe_"+ty+fromid+"_"+uid).css("display")=="none")
				{
					//闪烁状态栏框
					$("#bar_"+fromid+"_"+uid).css("background",'yellow');
					
				}
				setlast2main(uid,ty,fromid,1,msgobj.content,msgobj.time);
			}
			else
			{
				//console.log('add to msgbox');
				//添加进消息数组
				//_addone(msg[i]);
				usr.addmsg(uid,fromid,msgobj,ty);
					
				//如果打开了消息盒子库,则直接加入到盒子库中，不显示闪烁
				if($('#msglib_board_'+uid).length>0)
				{
					add2lib(uid,fromid,ty,msgobj);
				}
				else
				{
					//创建消息盒子，并将最新列表消息加入
					//闪烁状态栏qq图标
					msgbox.add(uid,msgobj,ty);
					//console.log(usr.getallmsg(uid));
					//console.log(msgobj);
				}
				//console.log(usr.getmsg(msg[i].toid));
				setlast2main(uid,ty,fromid,0,msgobj.content,msgobj.time);
				//添加未读消息提示到主面板框的消息盒子图标中

			}
			//闪烁主面板好友框，并将最近好友移到或加入最前

			//开启提示音
			$('#gotamsg')[0].play();
			
		}
		if(ty=="newsinfo")
		{
			//开启提示音
			$('#gotasys')[0].play();
		}
		if(ty=="sys")
		{
			//验证信息及群系统信息不添加到消息数组中

			//var fromid=msgobj.ownid;
			//usr.addmsg(uid,fromid,msgobj,ty);
			//usr.addmsg(uid,fromid,msgobj,msgobj.type);
			if(msgobj.type=="addfrd"||msgobj.type=="grpsys")
			{
				var type=msgobj.type=="addfrd"?'frdverify':'grpsys';
				/*如果是好友验证消息，则先添加到验证盒子中,再判断自己的添加验证好友设置，如果是1或3，则提示加为好友按钮，如果是2或4，则提示同意或忽略按钮*/

				/*
					如果验证消息盒子没有打开，则加入到消息盒子中闪烁
					如果验证消息盒子打开了，则不显示到消息盒子中，在盒子中提示有新验证信息点击刷新，

					无论是否打开验证消息盒子，都在最近联系人中提示信息数，都加入到消息数组中
				*/
				//加入到消息盒子中
				//msgbox.add(uid,msgobj,ty);

				//验证消息盒子已打开
				if($("#verifymsgbox_board_"+uid).length>0)
				{
					/*
					在盒子中添加提示有新验证信息点击刷新，点击刷新后ajax获取用户的信息(获取消息同时查看该用户是否已经有未处理isadd=2验证消息且ignore_this=0，如果有则将之前未处理且未忽略的验证消息update为本条)，2015/11/12已经在发送好友申请时更新处理，此处不用处理
					如果已经有同一用户,则将该信息替换，如果没有则添加一条，将提示信息删除
					*/
					var board=$("#verifymsgbox_board_"+uid+" .verifymsgbox_detail_"+type);
					if(board.find('.verifymsgbox_detail_newtips').length>0)
					{
						var num=board.find('.verifymsgbox_detail_newtips .'+type+'num').html();
						board.find('.verifymsgbox_detail_newtips .'+type+'num').html(parseInt(num)+1);
					}
					else
					{
						board.append('<a class="verifymsgbox_detail_newtips" href="javascript:;" onClick="msgcenter.add2vbox('+uid+',\''+msgobj.type+'\');">有<font color="red" class="'+type+'num">1</font>条新'+(msgobj.type=="addfrd"?'好友验证':'群系统消息')+'信息，点击刷新 <div class="closethis"></div></a>');
					}
				}
				else//未打开
				{
					/*
					打开盒子时在消息数组中获取所有验证消息（ignore_this=0），并获取所有验证消息发送者的信息，如果验证消息有重复，则只获取显示最新的一条，将之前的ignore_this=0都清除掉
					*/
					//因为点击后直接刷新获取所有系统消息，因此不用添加到消息数组中
					//显示闪烁
					msgbox.add(uid,msgobj,ty);

				}
				//加入或追加到主面板最近联系中

			}
			else if(msgobj.type=="")
			{

			}
			//开启提示音
			$('#gotasys')[0].play();
			//console.log(uid+'---获取都一条系统信息---');
			//console.log(msgobj);
			//console.log('------------------------');
		}

		if(ty=="verify")
		{
			var isadd=parseInt(msgobj.isadd);
			console.log(uid+'---获取都一条验证回复信息---isadd='+isadd);
			console.log(msgobj);
			console.log('------------------------');
			if(isadd)
			{
				if(isadd==1)//如果是同意加为好友，则
				{
					//根据验证消息的设置，添加到mainboard的好友列表中，并模拟该好友发送一条消息(你已经与我称成为好友，与我聊天吧)提示闪烁，并在最近联系中出现
					
					_ajaxget('u='+uid+'&&f='+msgobj.toid+'&&t=getfrd','getuser',function(m)
					{
						//将对方信息加入到我的好友全局数组中
						usr.addother(uid,m);
						//更新到页面mainboard(好友列表，最近联系)中
						var gid=parseInt(m.gid)==0?'default_'+uid:m.gid;
						var frdcnt=$("#ico_contacts_"+uid+" #frdgrp_"+gid+" .frdcontent");
						if(frdcnt.find('div[name="frd_'+m.id+'"]').length<=0)
						{
							frdcnt.append(
							'<div class="fds normal fds_online" name="frd_'+m.id+'">'+
							'<div class="imagehead"><img src="'+m.img+'"/><div class="frdolflag"></div></div>'+
							'<div class="frdmore"></div>'+
							'<div class="detail">'+
							'<div class="frdname">'+(m.frdname.length<=0?m.name:m.frdname)+'</div>'+
							'<div class="frdnew">'+m.sign+'</div>'+
							'</div>'+
							'</div>');
							//绑定事件
							_bindFdsClick();
						}

						//拼接称为好友的提示信息
						var o={
						content: "我们已经是好友了，现在开始对话吧！",
						fromid: msgobj.toid,
						mode: "newadd",
						time: msgobj.time.replace(' ',',').replace(/-/g,'/'),
						toid: uid,
						type: "newadd",
						};
						usr.addmsg(uid,msgobj.toid,o,'frd');
						//将提示信息添加到消息数组和消息盒子中
						msgbox.add(uid,o,'frd');
						//console.log(o);
						//console.log(usr.getmsg(uid));
						//开启提示音
						$('#gotamsg')[0].play();

					});
				}
			}
			else//拒绝我发送的请求
			{
				if($("#verifymsgbox_board_"+uid).length>0)
				{
					/*
					在盒子中添加提示有新验证信息点击刷新，点击刷新后ajax获取用户的信息(获取消息同时查看该用户是否已经有未处理isadd=2验证消息且ignore_this=0，如果有则将之前未处理且未忽略的验证消息update为本条)，2015/11/12已经在发送好友申请时更新处理，此处不用处理
					如果已经有同一用户,则将该信息替换，如果没有则添加一条，将提示信息删除
					*/
					var board=$("#verifymsgbox_board_"+uid+" .verifymsgbox_detail_frdverify");
					if(board.find('.verifymsgbox_detail_newtips').length>0)
					{
						var num=board.find('.verifymsgbox_detail_newtips .frdverifynum').html();
						board.find('.verifymsgbox_detail_newtips .frdverifynum').html(parseInt(num)+1);
					}
					else
					{
						board.append('<a class="verifymsgbox_detail_newtips" href="javascript:;" onClick="msgcenter.add2vbox('+uid+',\'addfrd\');">有<font color="red" class="frdverifynum">1</font>条新好友验证信息，点击刷新 <div class="closethis"></div></a>');
					}
				}
				else//未打开
				{
					/*
					打开盒子时在消息数组中获取所有验证消息（ignore_this=0），并获取所有验证消息发送者的信息，如果验证消息有重复，则只获取显示最新的一条，将之前的ignore_this=0都清除掉
					*/
					//因为点击后直接刷新获取所有系统消息，因此不用添加到消息数组中
					//显示闪烁
					msgbox.add(uid,msgobj,'refused');

				}
				
				//开启提示音
				$('#gotasys')[0].play();
			}

		}
		
	}

	//添加到验证消息盒子方法(获取所有type的信息，并更新显示到)
	var _add2vbox=this.add2vbox=function(uid,type)
	{
		/*
		console.log(uid+','+type);
		var m=usr.gettypemsg(uid,type);
		console.log(m);
		
		for(var i=0;i<m.length;i++)
		{
			var ownid=m[i].fromid;
			//直接获取最后一条验证信息
			var cnt=m[i].cnt[m[i].cnt.length-1];

			//检查验证消息盒子中是否有此条目，有则替换无则添加
		}
		*/

		//ajax获取信息 getverifylist.php
		
		$.ajax({
			url:'action/getverifylist.php',
			method:'POST',
			dataType:'json',
			data:'u='+uid+'&&t='+type,
			success:function(m)
			{
				//console.log(m);
				var ptype=type=="addfrd"?'frdverify':'grpsys';
				var vpage=$('#verifymsgbox_board_'+uid+' .verifymsgbox_detail_'+ptype+' .verifymsgbox_detail_page');
				//清空页面
				vpage.html('');
				//去掉提示
				$('#verifymsgbox_board_'+uid+' .verifymsgbox_detail_'+ptype+' .verifymsgbox_detail_newtips').remove();
				if(m)
				{
					if(type=="addfrd")
					{
						for(var i=0;i<m.length;i++)
						{
							var vfid=uid==m[i]['ownid']?m[i]['toid']:m[i]['ownid'];
							var psmsg=m[i].class=="refused"||m[i].class=="berefused"?m[i].refuse_intro:(_getValidateStr(uid,m[i].validate_str)+'<a href="">回复</a>');
							psmsg=uid==m[i]['ownid']?'':psmsg;
							var listbox=
							//<!--正常,ignored已忽略 hasadd同意并添加 oneadd对方单方面加我为好友 refused已拒绝 berefused被拒绝 imadd已添加对方对方没添加我 7种模式--->
							'<div class="frdverify_listbox '+m[i].class+'" fid="'+m[i].uid+'" vid="'+m[i].id+'">'+
							'<div class="delthis" onClick="_deleteThisVerify('+m[i].id+',this);"></div>'+
							'<div class="listhead"><img src="'+m[i].img+'"/></div>'+
							'<div class="listinfo">'+
							'<div class="frdname"><a class="frdnamefont">'+m[i].name+'</a><p class="frdfrom">'+(uid==m[i]['ownid']?'':_getVerifySource(m[i].source))+'</p></div>'+
							'<div class="frddetail"><div class="qzone"></div>'+(m[i].sex=='male'?'男':'女')+' '+(new Date().getFullYear()-new Date(m[i].birthday).getFullYear())+'岁 '+(m[i].livetown==""?m[i].hometown:m[i].livetown)+'</div>'+
							'<div class="verifymsg"><p class="verifymsgtitle">附加消息:</p>'+psmsg+'</div>'+
							'</div>'+
							'<div class="listctrl">'+
							'<div class="ignorebtn" onClick="_verify_select('+uid+','+m[i].id+',\'ignore\');">忽略</div>'+
							'<div class="addornot">'+
							'<div class="add" onClick="createVerifySubBox('+uid+','+m[i].id+',\'accept\');">同意</div>'+
							'<div class="sp"></div>'+
							'<div class="verifymsg_moreselect">'+
							'<div class="addornotbox">'+
							'<ul class="addornotlist">'+
							'<li class="accept" onClick="createVerifySubBox('+uid+','+m[i].id+',\'accept\');">同意</li>'+
							'<li class="refuse" onClick="createVerifySubBox('+uid+','+m[i].id+',\'refuse\');">拒绝</li>'+
							'</ul>'+
							'</div>'+
							'</div>'+
							'</div>'+
							'<p class="ignoretips">已忽略</p>'+
							'<p class="refusetips">已拒绝</p>'+
							'<p class="imaddtips">已添加为好友</p>'+
							'<p class="berefusetips">对方拒绝了你的好友请求</p>'+
							'<p class="hasaddtips">已同意并添加为好友</p>'+
							'<div class="addtofrdbtn" onClick="_verify_select('+uid+','+m[i].id+',\'oneadd\','+vfid+');" title="对方已经添加你为好友，添加对方为好友后方可互相联系">加为好友</div>'+
							'</div>'+
							'<div class="clear"></div>'+
							'</div>';
							var now=new Date().getFullYear()+'-'+(new Date().getMonth()+1)+'-'+(new Date().getDate()<10?'0'+new Date().getDate():new Date().getDate());
							var date=m[i].time.split(' ')[0];
							
							var handletype=(m[i].class.length>0&&m[i].class!='oneadd')?'hashandle':'nothandle';

							var handleboard=vpage.find('.'+handletype);
							if(handleboard.length>0)//如果已经有忽略信息板
							{
								
								if(handleboard.find('li[date="'+date+'"]').length>0)//如果日期板已经存在，
								{
									//console.log('已存在'+m[i].time+','+m[i].name);
									//handleboard.find('li[date="'+date+'"] .timehead').after(listbox);
									handleboard.find('li[date="'+date+'"]').append(listbox);
								}
								else//还没有日期板
								{
									var showdate=null;
									if(now==date)
									{
										showdate='今天';
									}
									else if(now=date-1)
									{
										showdate='昨天';
									}
									else
									{
										showdate=date;
									}

									handleboard.append(
									'<li date="'+date+'">'+
									'<p class="timehead">'+showdate+'</p>'+
									listbox+
									'</li>'
									);
								}
							}
							else//还没有忽略信息板
							{
								var showdate=null;
								if(now==date)
								{
									showdate='今天';
								}
								else if(now=date-1)
								{
									showdate='昨天';
								}
								else
								{
									showdate=date;
								}
								var hb=
								'<ul class="'+handletype+'">'+
								(parseInt(m[i].class.length)>0?'<li class="doneline">以上为待处理信息</li>':'')+
								'<li date="'+date+'">'+
								'<p class="timehead">'+showdate+'</p>'+
								listbox+
								'</li>'+
								'</ul>';
								if(handletype=="nothandle"&&vpage.find('.hashandle').length>0)
								{
									vpage.find('.hashandle').before(hb);
								}
								else
								{
									vpage.append(hb);
								}
							}
						}

						$('.verifymsg_moreselect').click(function()
						{
							$(this).find('.addornotbox').css('display','block');
						});
					}
					else if(type=="grpsys")
					{

					}
				}
				else
				{
					console.log('暂无验证消息');
					vpage.html('<div class="verifymsgbox_notmsg"></div>');
				}
			}
			,
			error:function()
			{
				console.log('网络或程序出错，重试看看');
			}
		});

	}
	
	//根据代码获取验证信息来源 供add2vbox使用 0=账号查找，1=条件查找，2=群聊天，3=临时会话，4=其他
	var _getVerifySource=function(num)
	{
		var num=parseInt(num);
		var str='未知';
		switch(num)
		{
			case 0:
				str='账号查找';
				break;
			case 1:
				str='条件查找';
				break;
			case 2:
				str='群聊天';
				break;
			case 3:
				str='临时会话';
				break;
			case 4:
				str='其他';
				break;
			default:
				str='未知';
		}
		return '来自'+str;
	}
	//获取用户的验证设置，并将验证信息与验证问题拼接，供add2vbox使用
	var _getValidateStr=function(uid,valistr)
	{
		var vs='';
		var set=usr.getpro(uid,'setting');
		var vd=parseInt(set['addvalidate']);
		if(vd==2)
		{
			vs=vd;
		}
		else if(vd==4)
		{
			var qs=set['addvalidate_question'].split(';');
			//qs[qs.length-1]==""?qs.remove(q.length-1);
			var valistr=valistr.split(';');
			//valistr[valistr.length-1]==""?valistr.remove(valistr.length-1);
		
			for(var i=0;i<qs.length;i++)
			{
				if(qs[i].length>0)
				{
					vs+='<p class="verifymsg_qa">问题'+(i+1)+'：'+qs[i]+'？</p>';
					vs+='<p class="verifymsg_qa">答：'+valistr[i]+'。</p>';
				}
			}
		}

		return vs;
		
	}
	
	


	



	//添加到消息盒子库方法
	var add2lib=this.add2lib=function(uid,fid,ty,msgobj)
	{
		
		//两种模式
		//1，全添加模式		参数仅为uid				首次打开消息盒子库时使用
		//2，追加模式(单条)	参数为 uid,fid,ty,msg	消息盒子库打开后才使用
		
		//================本方法是追加模式============================
		var mp=$('#msglib_board_'+uid);
		var sender=false;

		if(ty=="frd"||ty=="grp"||ty=="dis")
		{

			var numset=mp.find('.msglib_title_resent');
			if(numset.html()=='最近')
			{
				numset.html('最近(1)');
			}
			else
			{
				numset.html('最近('+(parseInt(numset.html().replace(/最近\((\d+)\)/,'$1'))+1)+')');
			}
			//发送者列表框
			sender=mp.find('.msglib_content_resent .msglib_list_cnt');
			//如果还没有好友/群/讨论组的消息
			if(sender.find('.msglib_'+ty).length<=0)
			{
				var tie='';
				switch(ty)
				{
					case 'frd':
						tie='好友';
						break;
					case 'grp':
						tie='群';
						break;
					case 'dis':
						tie='讨论组';
						break;
					default:
						tie='好友';
				}
				sender.append('<ul class="msglib_'+ty+'"><li class="msglib_list_head">'+tie+'会话</li></ul>');
			}
			
			//如果已有该发送者，则更新最新消息;没有则添加一个新的发送者
			var senderli=sender.find('.msglib_'+ty).find('li[senderid="'+ty+'_'+fid+'"]')
			if(senderli.length>0)
			{
				senderli.find('.newst').html(msgobj.content);
				senderli.find('.lasttime').html(msgobj.time.split(',')[1].substring(0,5));
				senderli.find('.count').html((parseInt(senderli.find('.count').html().replace('条',''))+1)+'条');
			}
			else
			{
				sender.find('.msglib_'+ty).append(
				'<li class="msglib_list_who" senderid="'+ty+'_'+fid+'">'+
				'<div class="header"><div class="headimg"><img src="'+usr.getaother(uid,fid,ty).img+'"/></div></div>'+
				'<div class="cnter"><div class="namer">'+
				'<div class="lasttime">'+(msgobj.time.split(',')[1].substring(0,5))+'</div>'+
				'<div class="count">1条</div>'+
				'<div class="fname">'+usr.getaother(uid,fid,ty).name+'('+usr.getaother(uid,fid,ty).account+')</div></div>'+
				'<div class="newst">'+msgobj.content+'</div>'+
				'</div></li>'	
				);
			}
			
			//设置中有：1，默认显示第一条；2，默认显示最后一条；
			//如果此条是第一条，则直接显示信息框；如果不是第一条，则根据设置来判断是否显示
			if(sender.find('.msglib_list_who').length==1||(sender.find('.msglib_list_who').length>1&&parseInt(usr.getpro(uid,'setting')['msgbox_showfirst']))==0||sender.find('.msglib_list_who').length>1&&mp.find('.msglib_detail_tab').attr('senderid')==(ty+'_'+fid))
			{
				mp.find('.whiteboard').remove();
				/*
				几种情况
				1，如果是只有一个人：如果只有一条消息，则创建;如果已经有多条，则追加
				2，有多个人，如果设置是显示第一条，则不理；如果设置显示最新一条：如果此人已经没有框，则创建;有则追加
				*/
				var m=usr.getomsg(uid,fid,ty);
				var detail=mp.find('.msglib_content_resent .msglib_detail');
				//console.log('m=');
				//console.log(m);
				//如果已经有消息，则追加
				if(m&&m.cnt.length-1>0&&detail.find('div[senderid="'+ty+'_'+fid+'"]').length>0)
				{
					detail.find('.msglib_detail_listpage').append(
					'<li class="msglib_li">'+
					'<div class="msghead">'+usr.getaother(uid,fid,ty).name+'&nbsp;&nbsp;'+msgobj.time.split(',')[1]+'</div>'+
					'<div class="msgcnt">'+msgobj.content+'</div></li>'
					);
					Scroll.reset(detail.find('.msglib_detail_list'),detail.find('.msglib_detail_listcnt'),detail.find('.msglib_detail_listpage'));
					//console.log('追加');
				}
				else//如果只有一条消息，则创建
				{
					//console.log('创建');
					var lis='';
					for (var i=0;i<m.cnt.length;i++)
					{
						lis+=
						'<li class="msglib_li">'+
						'<div class="msghead">'+usr.getaother(uid,fid,ty).name+'&nbsp;&nbsp;'+m.cnt[i].time.split(',')[1]+'</div>'+
						'<div class="msgcnt">'+m.cnt[i].content+'</div></li>';
					}
					detail.html(
					'<div class="msglib_detail_tab" senderid="'+ty+'_'+fid+'">'+
					'<div class="msglib_detail_tool">'+
					'<div class="msglib_detail_tool_title msglib_open"><div class="msglib_openimg"></div>打开</div>'+
					'<div class="msglib_detail_tool_title msglib_reply"><div class="msglib_replyimg"></div>回复</div>'+
					'<div class="msglib_detail_tool_title msglib_ignore"><div class="msglib_ignoreimg"></div>忽略</div>'+
					'<div class="clear"></div></div>'+
					'<div class="msglib_detail_frd">'+
					'<div class="header">'+
					'<div class="headerimg"><img src="'+usr.getaother(uid,fid,ty).img+'"/><div class="ol_type"></div></div></div>'+
					'<div class="namer"><div class="fname">'+usr.getaother(uid,fid,ty).name+'('+usr.getaother(uid,fid,ty).account+')</div><div class="sign">'+usr.getaother(uid,fid,ty).sign+'</div></div></div>'+
					'<div class="msglib_detail_list">'+
					'<div class="msglib_detail_listcnt">'+
					'<ul class="msglib_detail_listpage">'+
					lis+
					/*'<li class="msglib_li">'+
					'<div class="msghead">'+usr.getaother(uid,fid,ty).name+'&nbsp;&nbsp;'+msgobj.time.split(',')[1]+'</div>'+
					'<div class="msgcnt">'+msgobj.content+'</div></li>'+
					*/
					'</ul></div></div></div>'
					);
				}

				//设置选中
				sender.find('.msglib_list_who').removeClass('selected');
				sender.find('li[senderid="'+ty+'_'+fid+'"]').addClass('selected');

				//绑定事件
				
			}
			else
			{
				ty='sys';
				//发送者列表框
				sender=mp.find('.msglib_content_sys .msglib_list_cnt');




			}
			_msgbind();

		}
	}

	//绑定消息盒子库的按钮事件
	this.msglibbind=_msgbind=function()
	{
		//发送者列表
		var msglibwho=null;
		$('.msglib_list_who').click(function(e)
		{
			var ts=$(this);
			clearTimeout(msglibwho);
			msglibwho=setTimeout(function()
			{	
				if(ts.hasClass('selected'))
				{
					return false;
				}
				var uid=ts.parents('.msglib_board').attr('id').replace('msglib_board_','');
				var senderid=ts.attr('senderid');
				var k=/(\w+)_(\d+)/.exec(senderid);
				var ty=k[1];
				var fid=k[2];
				var html='';
				var m=usr.getomsg(uid,fid,ty);
				if(!m||m.cnt==undefined||m.cnt.length<=0)
				{
					ts.remove();
					return;
				}

				if(ty=='frd'||ty=='grp'||ty=='dis')
				{
					var lis='';
					for (var i=0;i<m.cnt.length;i++)
					{
						lis+=
						'<li class="msglib_li">'+
						'<div class="msghead">'+usr.getaother(uid,fid,ty).name+'&nbsp;&nbsp;'+m.cnt[i].time.split(',')[1]+'</div>'+
						'<div class="msgcnt">'+m.cnt[i].content+'</div></li>';
					}
					html=
					'<div class="msglib_detail_tab" senderid="'+ty+'_'+fid+'">'+
					'<div class="msglib_detail_tool">'+
					'<div class="msglib_detail_tool_title msglib_open"><div class="msglib_openimg"></div>打开</div>'+
					'<div class="msglib_detail_tool_title msglib_reply"><div class="msglib_replyimg"></div>回复</div>'+
					'<div class="msglib_detail_tool_title msglib_ignore"><div class="msglib_ignoreimg"></div>忽略</div>'+
					'<div class="clear"></div></div>'+
					'<div class="msglib_detail_frd">'+
					'<div class="header">'+
					'<div class="headerimg"><img src="'+usr.getaother(uid,fid,ty).img+'"/><div class="ol_type"></div></div></div>'+
					'<div class="namer"><div class="fname">'+usr.getaother(uid,fid,ty).name+'('+usr.getaother(uid,fid,ty).account+')</div><div class="sign">'+usr.getaother(uid,fid,ty).sign+'</div></div></div>'+
					'<div class="msglib_detail_list">'+
					'<div class="msglib_detail_listcnt">'+
					'<ul class="msglib_detail_listpage">'+
					lis+
					'</ul></div></div></div>';
				}
				else
				{

				}
				ts.parents('.msglib_content_board').find('.msglib_detail').html(html);
				ts.parents('.msglib_list_cnt').find('.selected').removeClass('selected');
				ts.addClass('selected');
				_msgbind();
			},300);
			e.stopImmediatePropagation();
		}).dblclick(function(e)
		{
			clearTimeout(msglibwho);
			var uid=$(this).parents('.msglib_board').attr('id').replace('msglib_board_','');
			var list=$(this).parents('.msglib_list');
			var detail=list.siblings('.msglib_detail');
			//var senderid=$(this).parents('.msglib_detail_tab').attr('senderid');
			var k=/(\w+)_(\d+)/.exec($(this).attr('senderid'));
			var ty=k[1];
			var fid=k[2];
			
			var wholength=(usr.getomsg(uid,fid,ty))['cnt'].length;
			
			new chatframe().init(usr.getaother(uid,fid,ty),uid,ty);
			
			//移除发送者列表
			if($(this).siblings('.msglib_list_who').length<=0&&ty!='sys')
			{
				$(this).parent('ul').remove();
			}
			else
			{
				$(this).remove();
			}
			//如果还有元素
			if(list.find('.msglib_list_who').length>0)
			{
				
				//根据设置显示第一条还是最新一条------------------------------------------------------
				var index=0;
				if(parseInt(usr.getpro(uid,'setting')['msgbox_showfirst']))
				{
					index=0;
				}
				else
				{
					index=list.find('.msglib_list_who').length>0?list.find('.msglib_list_who').length-1:0;
				}

				var next=list.find('.msglib_list_who').eq(index);
				var nid=/(\w+)_(\d+)/.exec(next.attr('senderid'));
				var nty=nid[1];
				var nfid=nid[2];

				next.addClass('selected');

				var html='';
				var m=usr.getomsg(uid,nfid,nty);

				if(ty=='frd'||ty=='grp'||ty=='dis')
				{
					list.parents('.msglib_cntboard').find('.msglib_title_resent').html('最近('+(parseInt(list.parents('.msglib_cntboard').find('.msglib_title_resent').html().replace(/最近\((\d+)\)/,'$1'))-wholength)+')');
					var lis='';
					for (var i=0;i<m.cnt.length;i++)
					{
						lis+=
						'<li class="msglib_li">'+
						'<div class="msghead">'+usr.getaother(uid,nfid,nty).name+'&nbsp;&nbsp;'+m.cnt[i].time.split(',')[1]+'</div>'+
						'<div class="msgcnt">'+m.cnt[i].content+'</div></li>';
					}
					html=
					'<div class="msglib_detail_tab" senderid="'+nty+'_'+nfid+'">'+
					'<div class="msglib_detail_tool">'+
					'<div class="msglib_detail_tool_title msglib_open"><div class="msglib_openimg"></div>打开</div>'+
					'<div class="msglib_detail_tool_title msglib_reply"><div class="msglib_replyimg"></div>回复</div>'+
					'<div class="msglib_detail_tool_title msglib_ignore"><div class="msglib_ignoreimg"></div>忽略</div>'+
					'<div class="clear"></div></div>'+
					'<div class="msglib_detail_frd">'+
					'<div class="header">'+
					'<div class="headerimg"><img src="'+usr.getaother(uid,nfid,nty).img+'"/><div class="ol_type"></div></div></div>'+
					'<div class="namer"><div class="fname">'+usr.getaother(uid,nfid,nty).name+'('+usr.getaother(uid,nfid,nty).account+')</div><div class="sign">'+usr.getaother(uid,nfid,nty).sign+'</div></div></div>'+
					'<div class="msglib_detail_list">'+
					'<div class="msglib_detail_listcnt">'+
					'<ul class="msglib_detail_listpage">'+
					lis+
					'</ul></div></div></div>';
				}
				else
				{
					list.parents('.msglib_cntboard').find('.msglib_title_sys').html('通知('+(parseInt(list.parents('.msglib_cntboard').find('.msglib_title_sys').html().replace(/通知\((\d+)\)/,'$1'))-wholength)+')');
				}
				detail.html(html);
				_msgbind();
			}
			else
			{
				if(parseInt(usr.getpro(uid,'setting')['msgbox_delnclose'])==1)
				{
					$('#msglib_board_'+uid).remove();
				}
				else
				{
					if(ty=='frd'||ty=='grp'||ty=='dis')
					{
						list.parents('.msglib_cntboard').find('.msglib_title_resent').html('最近');
					}
					else
					{
						list.parents('.msglib_cntboard').find('.msglib_title_sys').html('通知');
					}
					list.parents('.msglib_content_board').append('<div class="whiteboard">暂时没有未读消息</div>');
					detail.html('');
				}
			}			


			e.stopImmediatePropagation();
		});
		
		//点击消息时选中
		$('.msglib_li').click(function(e)
		{			
			if($(this).hasClass('selected'))
			{
				return false;
			}
			$(this).siblings('.selected').removeClass('selected');
			$(this).addClass('selected');
			
			e.stopImmediatePropagation();
		});
	
		//设置滚动页
		$('.msglib_detail_list').mouseover(function(e)
		{
			Scroll.set($(this),$(this).find('.msglib_detail_listcnt'),$(this).find('.msglib_detail_listpage'));
			e.stopImmediatePropagation();
		});
		
		//打开全部
		$('.msglib_openall').click(function(e)
		{
			var whos=$(this).parents('.msglib_content_board').find('.msglib_list_who');
			if(whos.length<=0)
			{
				return false;
			}
			var uid=$(this).parents('.msglib_board').attr('id').replace('msglib_board_','');
			for(var i=0;i<whos.length;i++)
			{
				var k=/(\w+)_(\d+)/.exec(whos.eq(i).attr('senderid'));
				var ty=k[1];
				var fid=k[2];
				if(ty=='frd'||ty=='grp'||ty=='dis')
				{
					new chatframe().init(usr.getaother(uid,fid),uid,ty);
				}
				else
				{
				}

				whos.eq(i).remove();
			}
			$(this).parents('.msglib_content_board').find('.msglib_list_cnt').html('');
			$(this).parents('.msglib_content_board').find('.msglib_detail').html('');
			if(ty=='frd'||ty=='grp'||ty=='dis')
			{
				$(this).parents('.msglib_cntboard').find('.msglib_title_resent').html('最近');
			}
			else
			{
				$(this).parents('.msglib_cntboard').find('.msglib_title_sys').html('通知');
			}
			$(this).parents('.msglib_content_board').append('<div class="whiteboard">暂时没有未读消息</div>');
			e.stopImmediatePropagation();
		});
		//忽略全部
		$('.msglib_ignoreall').click(function(e)
		{
			if($(this).parents('.msglib_content').find('.msglib_list_who').length<=0)
			{
				return false;
			}

			var uid=$(this).parents('.msglib_board').attr('id').replace('msglib_board_','');
			for(var i=0;i<whos.length;i++)
			{
				var k=/(\w+)_(\d+)/.exec(whos.eq(i).attr('senderid'));
				var ty=k[1];
				var fid=k[2];
				if(ty=='frd'||ty=='grp'||ty=='dis')
				{
					//删除消息
					usr.getamsg(uid,fid,ty);

				}
				else
				{
				}

				whos.eq(i).remove();
			}
			$(this).parents('.msglib_content_board').find('.msglib_list_cnt').html('');
			$(this).parents('.msglib_content_board').find('.msglib_detail').html('');

			if(parseInt(usr.getpro(uid,'setting')['msgbox_delnclose'])==1)
			{
				$('#msglib_board_'+uid).remove();
			}
			else
			{
				if(ty=='frd'||ty=='grp'||ty=='dis')
				{
					$(this).parents('.msglib_cntboard').find('.msglib_title_resent').html('最近');
				}
				else
				{
					$(this).parents('.msglib_cntboard').find('.msglib_title_sys').html('通知');
				}
				$(this).parents('.msglib_content_board').append('<div class="whiteboard">暂时没有未读消息</div>');
			}
			e.stopImmediatePropagation();
		});
		//打开
		$('.msglib_open').click(function(e)
		{
			var uid=$(this).parents('.msglib_board').attr('id').replace('msglib_board_','');
			var detail=$(this).parents('.msglib_detail');
			//var senderid=$(this).parents('.msglib_detail_tab').attr('senderid');
			var k=/(\w+)_(\d+)/.exec($(this).parents('.msglib_detail_tab').attr('senderid'));
			var ty=k[1];
			var fid=k[2];
			
			var wholength=(usr.getomsg(uid,fid,ty))['cnt'].length;
			
			new chatframe().init(usr.getaother(uid,fid,ty),uid,ty);
			
			//移除发送者列表
			var who=detail.siblings('.msglib_list').find('li[senderid="'+ty+'_'+fid+'"]');
			if(who.siblings('.msglib_list_who').length<=0&&ty!='sys')
			{
				who.parent('ul').remove();
			}
			else
			{
				who.remove();
			}
			//如果还有元素
			if(detail.siblings('.msglib_list').find('.msglib_list_who').length>0)
			{
				
				//根据设置显示第一条还是最新一条------------------------------------------------------
				var index=0;
				if(parseInt(usr.getpro(uid,'setting')['msgbox_showfirst']))
				{
					index=0;
				}
				else
				{
					index=detail.siblings('.msglib_list').find('.msglib_list_who').length>0?detail.siblings('.msglib_list').find('.msglib_list_who').length-1:0;
				}

				var next=detail.siblings('.msglib_list').find('.msglib_list_who').eq(index);
				var nid=/(\w+)_(\d+)/.exec(next.attr('senderid'));
				var nty=nid[1];
				var nfid=nid[2];

				next.addClass('selected');

				var html='';
				var m=usr.getomsg(uid,nfid,nty);

				if(ty=='frd'||ty=='grp'||ty=='dis')
				{
					$(this).parents('.msglib_cntboard').find('.msglib_title_resent').html('最近('+(parseInt($(this).parents('.msglib_cntboard').find('.msglib_title_resent').html().replace(/最近\((\d+)\)/,'$1'))-wholength)+')');
					var lis='';
					for (var i=0;i<m.cnt.length;i++)
					{
						lis+=
						'<li class="msglib_li">'+
						'<div class="msghead">'+usr.getaother(uid,nfid,nty).name+'&nbsp;&nbsp;'+m.cnt[i].time.split(',')[1]+'</div>'+
						'<div class="msgcnt">'+m.cnt[i].content+'</div></li>';
					}
					html=
					'<div class="msglib_detail_tab" senderid="'+nty+'_'+nfid+'">'+
					'<div class="msglib_detail_tool">'+
					'<div class="msglib_detail_tool_title msglib_open"><div class="msglib_openimg"></div>打开</div>'+
					'<div class="msglib_detail_tool_title msglib_reply"><div class="msglib_replyimg"></div>回复</div>'+
					'<div class="msglib_detail_tool_title msglib_ignore"><div class="msglib_ignoreimg"></div>忽略</div>'+
					'<div class="clear"></div></div>'+
					'<div class="msglib_detail_frd">'+
					'<div class="header">'+
					'<div class="headerimg"><img src="'+usr.getaother(uid,nfid,nty).img+'"/><div class="ol_type"></div></div></div>'+
					'<div class="namer"><div class="fname">'+usr.getaother(uid,nfid,nty).name+'('+usr.getaother(uid,nfid,nty).account+')</div><div class="sign">'+usr.getaother(uid,nfid,nty).sign+'</div></div></div>'+
					'<div class="msglib_detail_list">'+
					'<div class="msglib_detail_listcnt">'+
					'<ul class="msglib_detail_listpage">'+
					lis+
					'</ul></div></div></div>';
				}
				else
				{
					$(this).parents('.msglib_cntboard').find('.msglib_title_sys').html('通知('+(parseInt($(this).parents('.msglib_cntboard').find('.msglib_title_sys').html().replace(/通知\((\d+)\)/,'$1'))-wholength)+')');
				}
				detail.html(html);
				_msgbind();
			}
			else
			{
				if(parseInt(usr.getpro(uid,'setting')['msgbox_delnclose'])==1)
				{
					$('#msglib_board_'+uid).remove();
				}
				else
				{
				
					if(ty=='frd'||ty=='grp'||ty=='dis')
					{
						$(this).parents('.msglib_cntboard').find('.msglib_title_resent').html('最近');
					}
					else
					{
						$(this).parents('.msglib_cntboard').find('.msglib_title_sys').html('通知');
					}
					$(this).parents('.msglib_content_board').append('<div class="whiteboard">暂时没有未读消息</div>');
					detail.html('');
				}
			}
			e.stopImmediatePropagation();
		});
		//回复
		$('.msglib_reply').click(function(e)
		{
			$(this).siblings('.msglib_open').trigger('click');
			e.stopImmediatePropagation();
		});
		//忽略
		$('.msglib_ignore').click(function(e)
		{
			var uid=$(this).parents('.msglib_board').attr('id').replace('msglib_board_','');
			var detail=$(this).parents('.msglib_detail');
			//var senderid=$(this).parents('.msglib_detail_tab').attr('senderid');
			var k=/(\w+)_(\d+)/.exec($(this).parents('.msglib_detail_tab').attr('senderid'));
			var ty=k[1];
			var fid=k[2];
			
			var wholength=(usr.getamsg(uid,fid,ty))['cnt'].length;
			
			
			//移除发送者列表
			var who=detail.siblings('.msglib_list').find('li[senderid="'+ty+'_'+fid+'"]');
			if(who.siblings('.msglib_list_who').length<=0&&ty!='sys')
			{
				who.parent('ul').remove();
			}
			else
			{
				who.remove();
			}
			//如果还有元素
			if(detail.siblings('.msglib_list').find('.msglib_list_who').length>0)
			{
				
				//根据设置显示第一条还是最新一条------------------------------------------------------
				var index=0;
				if(parseInt(usr.getpro(uid,'setting')['msgbox_showfirst']))
				{
					index=0;
				}
				else
				{
					index=detail.siblings('.msglib_list').find('.msglib_list_who').length>0?detail.siblings('.msglib_list').find('.msglib_list_who').length-1:0;
				}

				var next=detail.siblings('.msglib_list').find('.msglib_list_who').eq(index);
				var nid=/(\w+)_(\d+)/.exec(next.attr('senderid'));
				var nty=nid[1];
				var nfid=nid[2];

				next.addClass('selected');

				var html='';
				var m=usr.getomsg(uid,nfid,nty);

				if(ty=='frd'||ty=='grp'||ty=='dis')
				{
					$(this).parents('.msglib_cntboard').find('.msglib_title_resent').html('最近('+(parseInt($(this).parents('.msglib_cntboard').find('.msglib_title_resent').html().replace(/最近\((\d+)\)/,'$1'))-wholength)+')');
					var lis='';
					for (var i=0;i<m.cnt.length;i++)
					{
						lis+=
						'<li class="msglib_li">'+
						'<div class="msghead">'+usr.getaother(uid,nfid,nty).name+'&nbsp;&nbsp;'+m.cnt[i].time.split(',')[1]+'</div>'+
						'<div class="msgcnt">'+m.cnt[i].content+'</div></li>';
					}
					html=
					'<div class="msglib_detail_tab" senderid="'+nty+'_'+nfid+'">'+
					'<div class="msglib_detail_tool">'+
					'<div class="msglib_detail_tool_title msglib_open"><div class="msglib_openimg"></div>打开</div>'+
					'<div class="msglib_detail_tool_title msglib_reply"><div class="msglib_replyimg"></div>回复</div>'+
					'<div class="msglib_detail_tool_title msglib_ignore"><div class="msglib_ignoreimg"></div>忽略</div>'+
					'<div class="clear"></div></div>'+
					'<div class="msglib_detail_frd">'+
					'<div class="header">'+
					'<div class="headerimg"><img src="'+usr.getaother(uid,nfid,nty).img+'"/><div class="ol_type"></div></div></div>'+
					'<div class="namer"><div class="fname">'+usr.getaother(uid,nfid,nty).name+'('+usr.getaother(uid,nfid,nty).account+')</div><div class="sign">'+usr.getaother(uid,nfid,nty).sign+'</div></div></div>'+
					'<div class="msglib_detail_list">'+
					'<div class="msglib_detail_listcnt">'+
					'<ul class="msglib_detail_listpage">'+
					lis+
					'</ul></div></div></div>';
				}
				else
				{
					$(this).parents('.msglib_cntboard').find('.msglib_title_sys').html('通知('+(parseInt($(this).parents('.msglib_cntboard').find('.msglib_title_sys').html().replace(/通知\((\d+)\)/,'$1'))-wholength)+')');
				}
				detail.html(html);
				_msgbind();
			}
			else
			{
				if(parseInt(usr.getpro(uid,'setting')['msgbox_delnclose'])==1)
				{
					$('#msglib_board_'+uid).remove();
				}
				else
				{
					if(ty=='frd'||ty=='grp'||ty=='dis')
					{
						$(this).parents('.msglib_cntboard').find('.msglib_title_resent').html('最近');
					}
					else
					{
						$(this).parents('.msglib_cntboard').find('.msglib_title_sys').html('通知');
					}
					$(this).parents('.msglib_content_board').append('<div class="whiteboard">暂时没有未读消息</div>');
					detail.html('');
				}
			}
			e.stopImmediatePropagation();
		});
		
	}



	//初始信息分配
	 this.allocation=function(msgall,uid)
	{
		 if(msgall==null||msgall==undefined||msgall.length<=0)
		{
			 return false;
		}
		if(msgall.cm&&msgall.cm.length>0)
		{
			var cm=msgall.cm;
			//console.log('------cm--------');
			//console.log(cm);
			//console.log('------cmend--------');
			for(var i=0;i<cm.length;i++)
			{
				usr.addmsg(uid,cm[i].fromid,cm[i],'frd');
				msgbox.add(uid,cm[i],'frd');
				setlast2main(uid,'frd',cm[i].fromid,0,cm[i].content,cm[i].time);
			}
			$('#gotamsg')[0].play();
			//console.log('------usrall--------');
			//console.log(usr.getall(uid));
			//console.log('------usrend--------');
		}
		if(msgall.grpmsg&&msgall.grpmsg.length>0)
		{
			var gm=msgall.grpmsg;
			for(var i=0;i<gm.length;i++)
			{
				usr.create_addmsg(uid,gm[i].gid,gm[i].msg,'grp');
				msgbox.init_grp_dis(uid,gm[i].gid,gm[i].msg,gm[i].count,'grp');
			}

			$('#gotamsg')[0].play();
		}
		if(msgall.dismsg&&msgall.dismsg.length>0)
		{
			var dm=msgall.dismsg;
			for(var i=0;i<dm.length;i++)
			{
				usr.create_addmsg(uid,dm[i].did,dm[i].msg,'dis');
				msgbox.init_grp_dis(uid,dm[i].did,dm[i].msg,dm[i].count,'dis');
			}
			$('#gotamsg')[0].play();
		}


	}








	var msgbox=this.msgbox=
	{
		flash:false,
		clear:function()
		{
			if(this.flash)
			{
				clearInterval(this.flash);
				window.clearInterval(this.flash);
				this.flash=false;
			}
		},
		create:function(uid)
		{
			$('body').append(
			'<div class="msgbox" id="msgbox_'+uid+'">'+
			'<div class="msgboxbar">'+
			'<div class="usernick">'+usr.getuser(uid).name+'</div>'+
			'<div class="msgboxset"></div>'+
			'<div class="clear"></div></div>'+
			'<ul></ul>'+
			'<div class="msgboxbottom">'+
			'<div class="ignoreall">忽略全部</div>'+
			'<div class="viewall">查看全部</div>'+
			'<div class="clear"></div></div></div>'	
			);
			/*var icow=$("#qqico_"+uid)[0].offsetWidth;
			var icoleft=$("#qqico_"+uid)[0].offsetLeft;
			var left=icoleft-(260-icow)/2;
			$('#msgbox_'+uid).css('left',left+'px');
			*/

			this._bind();
		},
		add:function(uid,msgarr,type)
		{
			//console.log('add=');
			//console.log(uid);
			//console.log(msgarr);
			//console.log('now msg_arr=');
			//console.log(msg_arr);
			//var uid=msgarr.toid;
			var fid=msgarr.fromid||msgarr.id;

			if($('#msgbox_'+uid).length<=0)
			{
				this.create(uid);
			}

			
			if($('#msgboxlist_'+type+fid+'_'+uid).length>0)
			{
				$('#msgboxlist_'+type+fid+'_'+uid+' .cnt').html(msgarr.content);
				$('#msgboxlist_'+type+fid+'_'+uid+' .numcnt').html(parseInt($('#msgboxlist_'+type+fid+'_'+uid+' .numcnt').html())+1);
			}
			else
			{

				var name=null;
				var img=null;
				var liclass=null;

				var lihtml='';
				if(type=="frd"||type=="grp"||type=="dis")
				{	
					//好友添加我为好友后没有收到消息且没有添加到主面板上的补救程序
					if(usr.getaother(uid,fid,type)===false)
					{
						console.log('---要获取用户信息了---');
						_ajaxget('u='+uid+'&&f='+fid+'&&t=getcheckfrd','getuser',function(m)
						{
							console.log('获取用户信息返回,双方是否好友：'+m.bothfrd);
							if(m.bothfrd==1||m.bothfrd==2)
							{
								//将对方信息加入到我的好友全局数组中
								usr.addother(uid,m);
								//更新到页面mainboard(好友列表，最近联系)中
								var gid=parseInt(m.gid)==0?'default_'+uid:m.gid;
								var frdcnt=$("#ico_contacts_"+uid+" #frdgrp_"+gid+" .frdcontent");
								if(frdcnt.find('div[name="frd_'+m.id+'"]').length<=0)
								{
									frdcnt.append(
									'<div class="fds normal fds_online" name="frd_'+m.id+'">'+
									'<div class="imagehead"><img src="'+m.img+'"/><div class="frdolflag"></div></div>'+
									'<div class="frdmore"></div>'+
									'<div class="detail">'+
									'<div class="frdname">'+(m.frdname.length<=0?m.name:m.frdname)+'</div>'+
									'<div class="frdnew">'+m.sign+'</div>'+
									'</div>'+
									'</div>');
									//绑定事件
									_bindFdsClick();
								}
							}
							else if(m.bothfrd==3||m.bothfrd==0)
							{
								//添加该用户到临时好友数组中


							}

						},false);
					}



					name=usr.getaother(uid,fid,type).frdname==''||usr.getaother(uid,fid,type).frdname==undefined?usr.getaother(uid,fid,type).name:usr.getaother(uid,fid,type).frdname;
					img=usr.getaother(uid,fid,type).img;
					liclass='frdhead';
				}
				/*else if(type=='newadd')//添加对方为好友后的自动提示
				{
					name=usr.getaother(uid,fid).frdname==''||usr.getaother(uid,fid).frdname==undefined?usr.getaother(uid,fid).name:usr.getaother(uid,fid).frdname;
					img=usr.getaother(uid,fid).img;
				}*/
				else if(type=='newsinfo')
				{
					if(msgarr.type=="news")
					{
						name="新闻头条";
						img=imgcan.news;
					}
					else if(msgarr.type=="discount")
					{
						name="今日优惠";
						img=imgcan.discount;
					}
				}
				else if(type=="sys")//------------------------------这里要设置系统消息的css差异
				{
					if(msgarr.type=="addfrd")
					{
						name="好友添加验证消息";
						//img=imgcan.addfrd;
						img='img/VerifyMsg/SessionNode.png';
						type='addfrd';
					}
					else if(msgarr.type=="grpsys")
					{
						name="群系统消息";
						img=imgcan.grpsys;
						type='grpsys';
					}
					liclass='syshead';
				}
				else if(type=="refused")//------------------------------这里要设置系统消息的css差异
				{
					
					name="对方拒绝了你的好友请求";
					//img=imgcan.addfrd;
					img='img/VerifyMsg/SessionNode.png';
					type='addfrd';
					liclass='syshead';
				}
				
				$('#msgbox_'+uid+' ul').append(	
				'<li class="msgboxlist" id="msgboxlist_'+type+fid+'_'+uid+'">'+
				'<div class="'+liclass+'">'+
				'<img src="'+img+'"/>'+
				'</div>'+
				'<div class="'+(liclass=='syshead'?'syscnt':'newcnt')+'">'+
				(liclass=='syshead'?name:'<div class="frdname">'+name+'</div><div class="cnt">'+msgarr.content+'</div>')+
				'</div>'+
				'<div class="newnum">'+
				(liclass=='syshead'?'':'<div class="numcnt">1</div>')+
				'<div class="cantsee"><img src="img/informationbox/IgnoreMessageIcon.png"/></div>'+
				'</div>'+
				'</li>'
				);
			}
			this.bind(this);
			//set flash;
			this.setflash(uid);

		},


		init_grp_dis:function(uid,gdid,msgarr,count,type)
		{
			if($('#msgbox_'+uid).length<=0)
			{
				this.create(uid);
			}
			var name=null;
			var img=null;
			
			name=usr.getaother(uid,gdid,type).name;
			img=usr.getaother(uid,gdid,type).img;
			
			
			$('#msgbox_'+uid+' ul').append(	
			'<li class="msgboxlist" id="msgboxlist_'+type+gdid+'_'+uid+'">'+
			'<div class="frdhead">'+
			'<img src="'+img+'"/>'+
			'</div>'+
			'<div class="newcnt">'+
			'<div class="frdname">'+name+'</div>'+
			'<div class="cnt">'+msgarr[msgarr.length-1].content+'</div>'+
			'</div>'+
			'<div class="newnum">'+
			'<div class="numcnt">'+count+'</div>'+
			'<div class="cantsee"><img src="img/informationbox/IgnoreMessageIcon.png"/></div>'+
			'</div>'+
			'</li>'
			);
			this.bind(this);
			//set flash;
			this.setflash(uid);
		},
		setflash:function(uid)
		{
			this.clear();
			var ts=this;
			//var ms=_getmsgbyuid(uid);
			if($('#msgbox_'+uid+' li').length>0&&$("#msglib_board_"+uid).length<=0)
			{
				//var m=ms[ms.lengt-1];//get the last msg sender img
				var lastimg=$('#msgbox_'+uid+' li:last').find(".frdhead>img").attr("src")||$('#msgbox_'+uid+' li:last').find(".syshead>img").attr("src");
				var f=function()
				{
					$("#qqico_"+uid+'>img').attr('src')!=lastimg?$("#qqico_"+uid+'>img').attr('src',lastimg):$("#qqico_"+uid+'>img').attr('src','img/status/blank.ico');
					if($("#msglib_board_"+uid).length>0)
					{
						$('#msgbox_'+uid+' li').remove();
						ts.setflash(uid);
					}
				}
				this.flash=setInterval(f,800);
			}
			else
			{
				var scode=parseInt(usr.getpro(uid,'status'));
				var img='';
				switch(scode)
				{
					case 1:
						img="imonline";
						break;
					case 2:
						img="Qme";
						break;
					case 3:
						img="away";
						break;
					case 4:
						img="busy";
						break;
					case 5:
						img="mute";
						break;
					case 6:
						img="invisible";
						break;
					default:
						img="imoffline";
				}
				$("#qqico_"+uid+'>img').attr('src','img/status/qq/'+img+'_16.png?v=1');
			}

		},
		remove:function(fid,uid)
		{
			$('#msgboxlist_'+fid+'_'+uid).remove();
		},
		_bind:function()
		{
		
			/*$(".msgbox").mouseout(function()
			{
				$(this).css("display","none");
			});*/
		},

		bind:function(ts)
		{
			/*$(".msgbox").mouseout(function()
			{
				$(this).css("display","none");
			});
			*/
			//var ts=this;
			$(".msgboxlist").click(function(e)
			{
				//console.log('msgboxlist,click');
				//open chatframe if have or create chatframe
				var chatid=$(this).attr("id").replace("msgboxlist","chatframe");
				//console.log('chatid='+chatid);
				var reg=/msgboxlist_([a-zA-z]+)(\d+)_(\d+)/;
					var mid=reg.exec($(this).attr("id"));//cid[0]=chatframe_x_y cid[1]=x cid[2]=y

					var uid=parseInt(mid[3]);
					var ftype=mid[1];
					var fid=mid[1]+mid[2];
					var foid=mid[2];
				//console.log(mid);
				if(ftype=="frd"||ftype=="grp"||ftype=="dis")
				{
					if($("#"+chatid).length>0)
					{
						$("#"+chatid).css('display','block').trigger('click');
					}
					else
					{
						//打开聊天框
						//console.log('open chatframe');
						setlast2main(uid,ftype,foid);
						new chatframe().init(usr.getaother(uid,foid,ftype),uid,ftype);//打开后获取信息盒子中所有该对象的信息
						//console.log('create chatframe=');
						//console.log(usr.getaother(uid,fid));
						var name=usr.getaother(uid,foid,ftype).frdname==''?usr.getaother(uid,foid,ftype).name:usr.getaother(uid,foid,ftype).frdname;
						bottombar.add(fid,uid,name);
					}

					//put all not read msg to box by function add2box();
					//var msgs=_getbyuid(uid);
					//console.log(usr.getmsg(uid));
					//console.log('userall=');
					//console.log(usr.getall(uid));
					var msgs=usr.getamsg(uid,foid,ftype);
					console.log(msgs);
					//console.log('---------msgs='+msgs);
					//console.log(msgs);
					if(msgs&&msgs.cnt!=undefined&&msgs.cnt!=null&&msgs.cnt.length>0)
					{
						for (var i=0;i<msgs.cnt.length ;i++)
						{
							add2box(msgs.cnt[i].id,'frd',fid,uid,msgs.cnt[i].mode,msgs.cnt[i].content,msgs.cnt[i].time);
						}
						//console.log('fid='+fid);
						tobottom(fid,uid);
					}
					else
					{
						console.log(uid+'没有消息在数组中');
					}
				}
				else if(ftype=="addfrd"||ftype=="refused")
				{
					//var msgs=usr.getamsg(uid,foid,ftype);
					//console.log('创建验证消息面板');
					if($("#verifymsgbox_js").length<=0)
					{
						$('body').append('<script id="verifymsgbox_js" type="text/javascript" src="js/verifymsgbox.js"></script>');
					}
					new VerifyMsgbox().init(uid);
					_add2vbox(uid,"addfrd");
				}
				
				if($(this).next('.msgboxlist').length<=0)
				{
					$('#msgbox_'+uid).css("display","none");
				}

				//$('#msgboxlist_'+fid+'_'+uid).remove();
				$(this).remove();
				//set the last falsh
				ts.setflash(uid);
				
				//阻止事件触发多次
				e.stopImmediatePropagation();

			});


			$('.cansee').click(function(e)
			{
				var mbl=$(this).parent('.newnum').parent('.msgboxlist');
				var reg=/msgboxlist_(\w+)_(\d+)/;
				var mid=reg.exec(mbl.attr("id"));//cid[0]=chatframe_x_y cid[1]=x cid[2]=y
				uid=parseInt(mid[2]);
				fid=mid[1];
				this.setflash(uid);
				
				mbl.remove();
				//阻止事件触发多次
				e.stopImmediatePropagation();
			});


		}
	};








	this.add2box=add2box=function(cmid,who,fid,uid,mode,str,sendtime,prepend)
	{
		//console.log(mode+','+str+','+sendtime);
		var msgcontent=str;
		var time=sendtime;
		var fid=fid;
		var who=who;
		var uid=uid;
		var mode=mode;
		var str=str;
		var someone=null;
		var objname=null;
		if(who=="me")
		{
			//time=backmsg.replace('ok:time=',"");
			someone=usr.getuser(uid);
			objname=someone.name;
		}
		else if(who=="frd")
		{
			
			//time=backmsg;
			var reg=/([a-zA-z]+)(\d+)/;
			var mid=reg.exec(fid);//cid[0]=chatframe_x_y cid[1]=x cid[2]=y
			//console.log('fid='+fid+' mid='+mid);
			var _type=mid[1];
			var _fid=mid[2];
			
			someone=usr.getaother(uid,_fid,_type);
			objname=someone.frdname.length>0?someone.frdname:someone.name;
		}

		time=time.split(',');
		var date=time[0];
		var tme=time[1];
		var stme=tme.split(':');

		if($("#chatcntpage_"+fid+"_"+uid+" .chatbox_msgtype").find('div[cmid="'+cmid+'"]').length>0)
		{
			//console.log('有相同，返回');
			return;
		}
		if($("#chatcntpage_"+fid+"_"+uid+" .sendtime_cnt").length>0)
		{
			//读取最后一个sendtime_cnt ,找出其内部msg_cnt最后一个的id是谁
			var sendcnt=prepend==true?$("#chatcntpage_"+fid+"_"+uid+" .sendtime_cnt:first"):$("#chatcntpage_"+fid+"_"+uid+" .sendtime_cnt:last");
			var uptime=sendcnt.find('.time_min').html().split(":");//获取最后一个时分并分割成数组
			var update=sendcnt.find('.time_min').attr("date");

			//判断年月日时分是否相同
			if(date==update&&uptime[0]==stme[0]&&uptime[1]==stme[1])
			{
				//console.log(cmid+'=时间相同');
				//如果时间相同，判断最后是否自己的消息
				var cnt=sendcnt.find('.msg_cnt:'+(prepend==true?'first':'last'));
				var lihtml='';
				if(cnt.attr("class").indexOf('msg_'+who)>=0)
				{
					//如果是，则直接添加到ul中
					if(mode=="text")
					{
						var getimg=/\[img format=([^\]]+)\]([^\]^\[]+)\[\/img\]/gmi;
						var getlink=/\[link\]([^\]^\[]+)\[\/link\]/gmi;
						if(who=="me")
						{
							str=str.replace(getimg,"<img class='spic' id='$2' />").replace(getlink,"<div class='sulink togetinfo'><div class='linksafeflag'></div><a target='_blank' href='$1'>$1</a></div>");
						}
						else if(who=="frd")
						{
							str=str.replace(getimg,"<img class='spic' name='$2' src='upload/$2.$1' />").replace(getlink,"<div class='sulink togetinfo'><div class='linksafeflag'></div><a target='_blank' href='$1'>$1</a></div>");
						}
						str=str.replace(/<a[\s\S]+href=[\'|\"]([^http:\/\/|^https:\/\/|^ftp:\/\/][^\"^\']+)[\'|\"]>([^>^<]+)<\/a>/gmi,"<a target='_blank' href='http://$1'>$2</a>");
						lihtml=
						'<li class="chatmsgli"><div class="senderimg"><img src="'+someone.img+'"/></div>'+
						'<div class="sendcnt"><div class="msgcnt" cmid="'+cmid+'">'+str+'</div></div>'+
						'<div class="clear"></div></li>';
					}
					else if(mode=="shake")
					{
						var name=who=='frd'?objname:'您';
						lihtml=
						'<li class="chatmsgli"><div class="gotashake">'+
						'<img src="img/OK_big.png"/>'+
						name+'发送了一个窗口抖动。'+
						'</div></li>';
					}
					else if(mode=="newadd")
					{
						lihtml=
						'<li class="chatmsgli"><div class="newaddfrdtips">'+
						'我们已经是好友了，现在开始对话吧！'+
						'</div></li>';
					}
					else if(mode=="pic")
					{
						var picimg=null;
						if(who=="me")
						{
							picimg='<img class="showaimg" id="'+str[0]+'" name="'+str[0]+'"  />';
						}
						else if(who=="frd")
						{
							
							var imgsrc=str.replace("[img][","").replace("][/img]","");
							//console.log('imgsrc='+imgsrc);
							picimg='<img class="showaimg" name="'+imgsrc.split(".")[0]+'" src="'+imgsrc+'"  />';
						}

						lihtml=
						'<li class="chatmsgli"><div class="senderimg"><img src="'+someone.img+'"/></div>'+
						'<div class="sendcnt"><div class="piccnt">'+
						'<div class="pic">'+
						picimg+
						'<div class="masking"></div><div class="loadimg"><div class="openview"></div></div>'+
						'</div></div></div><div class="clear"></div></li>';
						
					}
					//cnt.find('ul').append(lihtml);
					if(prepend==undefined||prepend==false||prepend<=0)
					{
						cnt.find('ul').append(lihtml);
					}
					else
					{
						cnt.find('ul li:first').before(lihtml);
					}
					
				}
				else//如果不是，则在本时间框中添加新的msg_me
				{
					var needcnt=null;
					var lihtml='';
					if(mode=="text")
					{
						var getimg=/\[img format=([^\]]+)\]([^\]^\[]+)\[\/img\]/gmi;
						var getlink=/\[link\]([^\]^\[]+)\[\/link\]/gmi;
						if(who=="me")
						{
							str=str.replace(getimg,"<img class='spic' id='$2' />").replace(getlink,"<div class='sulink togetinfo'><div class='linksafeflag'></div><a target='_blank' href='$1'>$1</a></div>");
						}
						else if(who=="frd")
						{
							str=str.replace(getimg,"<img class='spic' name='$2' src='upload/$2.$1' />").replace(getlink,"<div class='sulink togetinfo'><div class='linksafeflag'></div><a target='_blank' href='$1'>$1</a></div>");
						}
						str=str.replace(/<a[\s\S]+href=[\'|\"]([^http:\/\/|^https:\/\/|^ftp:\/\/][^\"^\']+)[\'|\"]>([^>^<]+)<\/a>/gmi,"<a target='_blank' href='http://$1'>$2</a>");
						needcnt='<div class="senderimg"><img src="'+someone.img+'"/></div><div class="sendcnt"><div class="msgcnt" cmid="'+cmid+'">'+str+'</div></div><div class="clear"></div>';
					}
					else if(mode=="shake")
					{
						var name=who=='frd'?objname:'您';
						needcnt='<div class="gotashake"><img src="img/OK_big.png"/>'+name+'发送了一个窗口抖动。</div>';
					}
					else if(mode=="newadd")
					{
						needcnt='<div class="gotashake">我们已经是好友了，现在开始对话吧！</div>';
					}
					else if(mode=="pic")
					{
						var picimg=null;
						if(who=="me")
						{
							picimg='<img class="showaimg" id="'+str[0]+'" name="'+str[0]+'"  />';
						}
						else if(who=="frd")
						{
							var imgsrc=str.replace("[img][","").replace("][/img]","");
							//console.log('imgsrc='+imgsrc);
							picimg='<img class="showaimg" name="'+imgsrc.split(".")[0]+'" src="'+imgsrc+'"  />';
						}

						needcnt='<div class="senderimg"><img src="'+someone.img+'"/></div><div class="sendcnt"><div class="piccnt"><div class="pic">'+picimg+'<div class="masking"></div><div class="loadimg"><div class="openview"></div></div></div></div></div><div class="clear"></div>';
							
						
					}
					//console.log('sendcnt append');
					
					lihtml=
					'<div class="msg_cnt msg_'+who+'">'+
					'<div class="senderinfo">'+
					'<div class="infocnt">'+
					'<div class="sendername">'+objname+'</div>'+
					'<div class="sendtime">'+(prepend==true?date+' ':'')+tme+'</div>'+
					'</div></div><ul>'+
					'<li class="chatmsgli">'+
					needcnt+
					'</li>'+
					'</ul></div>';
					//sendcnt.append(lihtml);
					
					if(prepend==undefined||prepend==false||prepend<=0)
					{
						sendcnt.append(lihtml);
					}
					else
					{
						sendcnt.find('.time_min').after(lihtml);
					}
					

				}
				
			}
			else //如果时间不同，则新开时间框，并加入msg_me
			{
				//console.log('时间不同');
				var needcnt=null;
				var lihtml='';
				if(mode=="text")
				{
					var getimg=/\[img format=([^\]]+)\]([^\]^\[]+)\[\/img\]/gmi;
					var getlink=/\[link\]([^\]^\[]+)\[\/link\]/gmi;
					if(who=="me")
					{
						str=str.replace(getimg,"<img class='spic' id='$2' />").replace(getlink,"<div class='sulink togetinfo'><div class='linksafeflag'></div><a target='_blank' href='$1'>$1</a></div>");
					}
					else if(who=="frd")
					{
						str=str.replace(getimg,"<img class='spic' name='$2' src='upload/$2.$1' />").replace(getlink,"<div class='sulink togetinfo'><div class='linksafeflag'></div><a target='_blank' href='$1'>$1</a></div>");
					}
					str=str.replace(/<a[\s\S]+href=[\'|\"]([^http:\/\/|^https:\/\/|^ftp:\/\/][^\"^\']+)[\'|\"]>([^>^<]+)<\/a>/gmi,"<a target='_blank' href='http://$1'>$2</a>");
					needcnt='<div class="senderimg"><img src="'+someone.img+'"/></div><div class="sendcnt"><div class="msgcnt" cmid="'+cmid+'">'+str+'</div></div><div class="clear"></div>';
				}
				else if(mode=="shake")
				{
					var name=who=='frd'?objname:'您';
					needcnt='<div class="gotashake"><img src="img/OK_big.png"/>'+name+'发送了一个窗口抖动。</div>';
				}
				else if(mode=="newadd")
				{
					needcnt='<div class="gotashake">我们已经是好友了，现在开始对话吧！</div>';
				}
				else if(mode=="pic")
				{
					var picimg=null;
					if(who=="me")
					{
						picimg='<img class="showaimg" id="'+str[0]+'" name="'+str[0]+'"  />';
					}
					else if(who=="frd")
					{
						var imgsrc=str.replace("[img][","").replace("][/img]","");
						//console.log('imgsrc='+imgsrc);
						picimg='<img class="showaimg" name="'+imgsrc.split(".")[0]+'" src="'+imgsrc+'"  />';
					}

					needcnt='<div class="senderimg"><img src="'+someone.img+'"/></div><div class="sendcnt"><div class="piccnt"><div class="pic">'+picimg+'<div class="masking"></div><div class="loadimg"><div class="openview"></div></div></div></div></div><div class="clear"></div>';
							
				}

				//console.log('msgtype inside append'+$("#chatcntpage_"+id+" .sendtime_cnt").length+"date="+date+" stme="+stme+" update="+update+" uptime="+uptime);
				lihtml=
				'<div class="sendtime_cnt">'+
				'<div class="time_min" date="'+date+'">'+/*(prepend==true?date+' '+tme:stme[0]+":"+stme[1])*/(stme[0]+":"+stme[1])+'</div>'+
				'<div class="msg_cnt msg_'+who+'">'+
				'<div class="senderinfo">'+
				'<div class="infocnt">'+
				'<div class="sendername">'+objname+'</div>'+
				'<div class="senddate"></div>'+
				'<div class="sendtime">'+(prepend==true?date+' ':'')+tme+'</div>'+
				'</div></div><ul>'+
				'<li class="chatmsgli">'+
				needcnt+
				'</li>'+
				'</ul></div></div>';
				if(prepend==undefined||prepend==false||prepend<=0)
				{
					$("#chatcntpage_"+fid+"_"+uid+">.chatbox_msgtype").append(lihtml);
				}
				else
				{
					$("#chatcntpage_"+fid+"_"+uid+">.chatbox_msgtype .showhistorylink").after(lihtml);
				}
				
			}
		
		}
		else
		{
			var needcnt=null;
			var lihtml='';
			if(mode=="text")
			{
				var getimg=/\[img format=([^\]]+)\]([^\]^\[]+)\[\/img\]/gmi;
				var getlink=/\[link\]([^\]^\[]+)\[\/link\]/gmi;
				if(who=="me")
				{
					str=str.replace(getimg,"<img class='spic' id='$2' />").replace(getlink,"<div class='sulink togetinfo'><div class='linksafeflag'></div><a target='_blank' href='$1'>$1</a></div>");
				}
				else if(who=="frd")
				{
					str=str.replace(getimg,"<img class='spic' name='$2' src='upload/$2.$1' />").replace(getlink,"<div class='sulink togetinfo'><div class='linksafeflag'></div><a target='_blank' href='$1'>$1</a></div>");
				}
				str=str.replace(/<a[\s\S]+href=[\'|\"]([^http:\/\/|^https:\/\/|^ftp:\/\/][^\"^\']+)[\'|\"]>([^>^<]+)<\/a>/gmi,"<a target='_blank' href='http://$1'>$2</a>");
				needcnt='<div class="senderimg"><img src="'+someone.img+'"/></div><div class="sendcnt"><div class="msgcnt" cmid="'+cmid+'">'+str+'</div></div><div class="clear"></div>';
			}
			else if(mode=="shake")
			{
				var name=who=='frd'?objname:'您';
				needcnt='<div class="gotashake"><img src="img/OK_big.png"/>'+name+'发送了一个窗口抖动。</div>';
			}
			else if(mode=="newadd")
			{
				needcnt='<div class="gotashake">我们已经是好友了，现在开始对话吧！</div>';
			}
			else if(mode=="pic")
			{
				var picimg=null;
				if(who=="me")
				{
					picimg='<img class="showaimg" id="'+str[0]+'" name="'+str[0]+'"  />';
				}
				else if(who=="frd")
				{
					var imgsrc=str.replace("[img][","").replace("][/img]","");
					//console.log('imgsrc='+imgsrc);
					picimg='<img class="showaimg" name="'+imgsrc.split(".")[0]+'" src="'+imgsrc+'"  />';
				}

				needcnt='<div class="senderimg"><img src="'+someone.img+'"/></div><div class="sendcnt"><div class="piccnt"><div class="pic">'+picimg+'<div class="masking"></div><div class="loadimg"><div class="openview"></div></div></div></div></div><div class="clear"></div>';
						
			}
			//console.log('msgtype outside append '+$("#chatcntpage_"+id+" .sendtime_cnt").length);
			lihtml=
			'<div class="sendtime_cnt">'+
			'<div class="time_min" date="'+date+'">'+/*(prepend==true?date+' '+tme:stme[0]+":"+stme[1])*/(stme[0]+":"+stme[1])+'</div>'+
			'<div class="msg_cnt msg_'+who+'">'+
			'<div class="senderinfo">'+
			'<div class="infocnt">'+
			'<div class="sendername">'+objname+'</div>'+
			'<div class="senddate"></div>'+
			'<div class="sendtime">'+date+' '+tme+'</div>'+
			'</div></div><ul>'+
			'<li class="chatmsgli">'+
			needcnt+
			'</li>'+
			'</ul></div></div>';
			//$("#chatcntpage_"+fid+"_"+uid+">.chatbox_msgtype").append(lihtml);
			if(prepend==undefined||prepend==false||prepend<=0)
			{
				$("#chatcntpage_"+fid+"_"+uid+">.chatbox_msgtype").append(lihtml);
			}
			else
			{
				$("#chatcntpage_"+fid+"_"+uid+">.chatbox_msgtype .showhistorylink").after(lihtml);
			}
			
		}

		if(mode=="pic")
		{
			if(who=="me")
			{
				//加载图片
				var fr=new FileReader();
				fr.onload=function(e)
				{
					$("#"+str[0]).attr("src",e.target.result);
				}
				//以URL方式读取img文件
				fr.readAsDataURL(str[1]);
				//图片加载完成后添加图片缩放比例的title(2015/8/5作废 新方法->鼠标移上时判断计算)
				/*$("#"+str[0]).load(function()
				{			
					var boxwidth=$("#chatcntpage_"+fid+"_"+uid)[0].offsetWidth;
					
					var im=new Image();
					im.src=$("#"+str[0]).attr("src");
					var imgsrcwidth=im.width;

					console.log('boxwidth='+boxwidth+" imgwidth="+imgsrcwidth);
					if(imgsrcwidth<boxwidth-4)
					{
						$("#"+str[0]).parent('.pic').attr("title","显示比例 : 100% , 双击查看原图");
					}
					else
					{
						var percent=Math.ceil((((boxwidth*0.85)-4)/imgsrcwidth)*100);
						console.log("per="+percent);
						$("#"+str[0]).parent('.pic').attr("title","显示比例 : "+percent+"% , 双击查看原图");
					}
				});
				*/
			}

			$("#chatcntpage_"+fid+"_"+uid+" .piccnt:last").find(".pic").on('dblclick',openimageview);
			$("#chatcntpage_"+fid+"_"+uid+" .piccnt:last").find(".openview").on('click',openimageview);
		}
		if(mode=="text")
		{
			
			if($(".togetinfo")!=null&&$(".togetinfo")!=undefined&&$(".togetinfo").length>0)
			{
				for(var i=0;i<$(".togetinfo").length;i++)
				{
					var obj=$(".togetinfo").eq(i);
					//ajax获取设置连接安全性
					setlinkinfo(obj);
					//动态绑定链接事件
					obj.on('mouseover',setsafetag).on('mouseout',displaysafetag);
				}
			}
			
			if(who=="me")
			{ 
				var reg=/([a-zA-z]+)(\d+)/;
				var mid=reg.exec(fid);//cid[0]=chatframe_x_y cid[1]=x cid[2]=y
				var _type=mid[1];
				var _fid=mid[2];

				var objs=img_ids.getall(uid,_fid);
				if(objs)
				{
					for(var i=0;i<objs.length;i++)
					{
						
						$("#"+objs[i].id).attr("src",objs[i].src);
						
					}
				}
			}
			$("#chatcntpage_"+fid+"_"+uid+" .msgcnt:last").find(".spic").on('dblclick',openimageview);
			
		}
		

		//新信息入框后要到底部还是添加到新信息提示栏上的处理
		var tipsbar=$("#chatframe_"+fid+"_"+uid+" .chatbottomnewtipsbar");
		var chatcnt=$('#chatbox_'+fid+'_'+uid+' .chatcntbox');
		var chatpage=chatcnt.find('.chatcntpage');
		var cch=chatcnt[0].clientHeight;
		var cph=chatpage[0].clientHeight;
		var cpt=parseInt(chatpage.css('top').replace('px',''));
		if(prepend!=true)
		{
			if(who=='me'||cch>=cph)
			{
				tipsbar.css('display','none');
				tobottom(fid,uid);
			}
			else
			{
				
				//console.log('cph='+cph+',cch='+cch+',cpt='+cpt+'=>'+(cph-cch+cpt));
				
				if(cph-cch+cpt>=60)
				{
					var pfid=fid.replace('frd','').replace('dis','').replace('grp','');
					var friend=usr.getaother(uid,pfid);
					tipsbar.find('.chatnewtips_who img').attr('src',friend.img);
					tipsbar.find('.chatnewtips_cnt').html((friend.frdname.length>0?friend.frdname:friend.name)+'：'+msgfilter(msgcontent,'txt'));
					tipsbar.show('slow');
				}
				else
				{
					tipsbar.css('display','none');
					tobottom(fid,uid);
				}

			}
		}

		//如果消息超过100条，且不是上滚查看历史操作，且滚动页的高度小于100的话，则把信息框的第0~第n-100-1条移除，并把顶部提示改为'更多消息请到消息记录中查看'
		var mcl=$("#chatcntpage_"+fid+"_"+uid+">.chatbox_msgtype .chatmsgli");
		//console.log((prepend!=true)+','+cpt+','+(cpt<=-150)+','+mcl.length);
		if(prepend!=true&&cpt<=-150&&mcl.length>80)
		{
			console.log('剔除'+(mcl.length-80)+'条信息');
			for(var i=0;i<mcl.length-80;i++)
			{
				if(mcl.eq(i).siblings('.chatmsgli').length<=0)
				{
					if(mcl.eq(i).parents('.msg_cnt').siblings('.msg_cnt').length<=0)
					{
						mcl.eq(i).parents('.sendtime_cnt').remove();
					}	
					else
					{
						mcl.eq(i).parents('.msg_cnt').remove();
					}
				}
				else
				{
					mcl.eq(i).remove();
				}
			}

			if($("#chatframe_"+fid+"_"+uid+" .midtoolcnt .msghis").hasClass('clicked'))
			{
				$("#chatcntpage_"+fid+"_"+uid+">.chatbox_msgtype .showhistorylink").attr('class','showhistorylink sh_ended cantload');
			}
			else
			{
				$("#chatcntpage_"+fid+"_"+uid+">.chatbox_msgtype .showhistorylink").attr('class','showhistorylink sh_end cantload');
			}

		}

			
	}



	/*
	获取链接信息
	*/

	function setlinkinfo(obj)
	{
		var safetag=obj.find(".linksafeflag");
		var link=obj.find("a").attr("href");
		var o=
		{
			
			url:'action/getinfo.php',
			data:'u='+link,
			dataType:'json',
			type:'POST',
			success:function(msg)
			{
				//console.log(msg);
				var flag=false;
				if(msg.safe)
				{
					var tag=null;
					switch(msg.safe)
					{
						case 0:
							tag='notsafe';
							break;
						case 1:
							tag='safe';
							break;
						case 2:
							tag='auth';
							//flag=true;
							break;
						case 3:
							tag='notice';
							break;
						case 4:
							tag='unknow';
							break;
						default:
							tag='unknow';

					}
					safetag.attr('class','linksafeflag '+tag);
				}
				//------------------------------------------------------------------获取网页预览，暂时不用2015/8/11-------------------------------------------------------------------
				if(flag)
				{
					obj.append(
					'<div class="linkinfo"><div class="infomsg" title="查看详情"><div class="infomsgimg"><img src="'+msg.img+'"/></div>'+
					'<div class="infomsgcnt"><div class="infomsgcnttitle">'+msg.title+'</div><div class="infomsgcntstr">'+msg.cnt+'</div></div></div>'+
					'<div class="linkctrl"><div class="open_sulink">打开</div><div class="collect_sulink">收藏</div><div class="share_sulink">分享</div></div></div>'	
					);
				}
			}
		};
		$.ajax(o);
	}










	this.show2box=function(fid,uid,type)
	{
		var msgs=usr.getamsg(uid,fid,type);
		//console.log("show2box->msgs=");
		//console.log(msgs);
		//console.log(msg_arr);

		if(msgs.cnt==undefined||msgs.cnt==null||msgs.cnt.length<=0)
		{
			return false;
		}
		for (var i=0;i<msgs.cnt.length ;i++ )
		{
			add2box(msgs.cnt[i].id,'frd',type+fid,uid,msgs.cnt[i].mode,msgs.cnt[i].content,msgs.cnt[i].time);
		}
		if($('#msgboxlist_'+type+fid+'_'+uid).next('.msgboxlist').length<=0)
		{
			$('#msgbox_'+uid).css("display","none");
		}

		//$('#msgboxlist_'+fid+'_'+uid).remove();
		$('#msgboxlist_'+type+fid+'_'+uid).remove();
		//set the last falsh
		msgbox.setflash(uid);
		tobottom(type+fid,uid);
	}
	
	//消息过滤器 用于将链接，图片，等代码转换为html代码 
	//2种模式 1，mix默认，转为html代码 ；2，txt ，转为文字意义
	var msgfilter=this.msgfilter=function(msgcontent,mode)
	{
		var str=msgcontent;
		var getimg=/\[img format=([^\]]+)\]([^\]^\[]+)\[\/img\]/gmi;
		var getlink=/\[link\]([^\]^\[]+)\[\/link\]/gmi;
		var bigimg=/\[img\]\[([^\]^\[]+)\]\[\/img\]/gmi;
		if(mode==undefined||mode=='mix')
		{
			str=str.replace(getimg,"<img name='$2' src='upload/$2.$1' />").replace(getlink,"<a target='_blank' href='$1'>$1</a>").replace(bigimg,"<img name='$1' src='upload/$1' />");
			//console.log(/<a[\s\S]+href=[\'|\"]([^http:\/\/|^https:\/\/|^ftp:\/\/][^\"^\']+)[\'|\"]>([^>^<]+)<\/a>/gmi.exec(str));
			str=str.replace(/<a[\s\S]+href=[\'|\"]([^http:\/\/|^https:\/\/|^ftp:\/\/][^\"^\']+)[\'|\"]>([^>^<]+)<\/a>/gmi,"<a target='_blank' href='http://$1'>$2</a>");
			//$("#chatcntpage_"+fid+"_"+uid+" .msgcnt:last").find(".spic").on('dblclick',openimageview);
		}
		else
		{
			str=str.replace(getimg,"[图片]").replace(getlink,"[链接]$1").replace(bigimg,"[大图]");
		}
		return str;
		//[http:\/\/|https:\/\/|ftp:\/\/]{0}[www\.]?[\w+\.]+[com|cn|org|net|tw|hk|gov|com\.cn|org\.cn|net\.cn][[\/[^<|^>|^\s|^\"|^\']*]*]
	}


}




var msgcenter=new MsgCenter();



/*
【好友消息】 (文字，小图，表情，链接等混合消息，魔法表情，震动，大图，文件等消息)
【群消息】	(文字，小图，表情，链接等混合消息，魔法表情，震动，大图，文件等消息)
【讨论组消息】	(文字，小图，表情，链接等混合消息，魔法表情，震动，大图，文件等消息)	
【新闻资讯】	（热点新闻，优惠产品）
【系统消息】	(群系统消息，好友添加消息)
【好友动态】

msgbox[i]=msg{
	【发送者id】senderid
	【发送者类型】sendertype（friend,group,discus,newsinfo,sys）
	【发送内容】cnt=array(
				[0](好友消息类型)= 关联表    frd[id,ownid,frdid,gid,frdname,chatid]  -> mychat[chatid]
				{
					id
					chatid(相互好友之间的id，便于查看记录)
					fromid
					toid
					type(混合消息，魔法表情，震动，大图，文件)
					content(混合消息=普通内容，魔法表情=魔法表情id，震动=空，大图=图片保存地址，文件=文件保存地址)
					time
					isread
				},
				[1](群消息类型=讨论组消息类型)=
				{
					id
					senderid
					gid/did
					type(混合消息，魔法表情，震动，大图，文件)
					content(混合消息=普通内容，魔法表情=魔法表情id，震动=空，大图=图片保存地址，文件=文件保存地址)
					time

				}
				[2](新闻资讯)=
				{
					id
					type(新闻news，优惠discount)
					title
					content
					sendtime
					deadtime
				}
				[3](系统消息类型)=
				{
					id
					type(群系统消息grpsys，好友添加消息addfrd)
					content(群系统消息=普通，好友添加消息=)
					time
				}
	
		
				)
	

}

======================================接收信息==========================================================
【好友消息】 isread=0,chatid=XXX
【群，讨论组消息】 >已读id
【新闻资讯】发送日期=当前日期 >已读id
【系统消息】isread=0

接收群发信息逻辑设计
	群讨论组，新闻资讯消息均属群发 读取后保存偏移id到用户群发信息读取表中

	用户群发信息读取表设计
	uid			用户id
	senderid	发送者id
	type		发送者类型     news/discount/group/discus/
	readid		已读取该群发消息的id
	
	轮询群发信息流程
	┏━>轮询提交要查询群，讨论组，新闻资讯的id和type--->model通过uid,senderid,type--->读取群读表的readid--->读取群发信息中senderid,type,id>readid的信息━>┓
	┃																																					   ┃
	┗━━━━━━━━━━━━━<---发送信息读取数组以轮询<---更新网页信息读取保存数组<---返回到网页显示 ━━━━━━━━━━━━━━━━━━━━━━━━━┛
															  ┃					 ┃
															[每隔30秒随status.php将信息读取数组中的读取id保存到数据库群读表，用户关闭QQ时也最后更新群读表一次]

	
																				

	用户登录时，【群，讨论组消息】 读取各个群讨论组的，群读表获取readid, 再计算各个群讨论组的大于readid的未读消息数，  (先判断已读id是否>最大id的数，如果大于则将readid归0)
									返回消息数和readid，更新到网页和信息读取数组中

				 【新闻资讯】      读取新闻资讯的readid,再查找新闻资讯表中大于readid并且在截止日期前（或当天）的信息，
									更新readid,并返回新闻资讯和最新的readid,更新到网页和信息读取数组中
	
	
	用户登录后【群发消息】通过readid接收 ，隔30秒和关闭QQ前，更新数据库readid
			   【好友消息】通过isread=0接收


接收大图，文件信息

大图：直接img异步加载
文件:通过php输出头信息下载

【好友消息中的陌生人】
接收信息后需要判断此好友是否我的好友，如果不是，则获取其信息，再提示



============================================发送信息==============================================================


大图，文件信息:多文件时通过循环上传函数上传






*/